2005年05月26日
川俣晶の縁側ソフトウェア技術雑記 total 5484 count

実はとても価値がある? Whitespace言語の実装は教育的に価値があるか!?

Written By: 川俣 晶連絡先

 話題の(?)Whitespace言語ですが、檜山さんがJavaで実装しました。

 以下にそれがあります。

 これを見て思いましたね。

 私も実装したい!

 これでも、子供の頃はいくつもトイ言語の言語仕様を作ったり実装をも書いていました。

 まさに、趣味にジャストミートなテーマです。

 もちろん私が書くなら、Javaのごとき古くつまらない言語は使いません。今ならC++/CLIで書くのが楽しそうですね。

 しかし、時間がないので断念しました。とても辛いね~。

Whitespace言語の実装の教育的価値 §

 その代わりに、別の話題について書きます。

 檜山さんは以下のように書いています。

というのは、Whitespace言語ってすごく教育的な感じがしたのです。ここで「教育的」とは、皮肉とか逆説的な意味ではなくて、ほんとに教育に役立つってことですよ。このことを説明すると長くなりそうなので、それもキマイラ・サイト番外編かな。

 言語仕様をチェックして、これが実感として良く分かりました。(檜山さんの趣旨と同じかどうかは分かりませんが)

 このWhitespace言語というのは、シンプルで素直なスタックマシンを扱う言語です。

 スタックマシンは、プログラム言語で言うと私が大好きなFORTHが典型的でしょうか。ちなみに、私はFORTHのインタプリタを実装するのは大好きでしたが、FORTHでコーディングするのは大嫌いでした (汗。

 ここでは、スタックマシンの例としてFORTHの価値を語るのは不適切でしょう。

 それよりも、プログラム言語の処理系を実現する際の、多くの中間コード、仮想コードが、スタックマシンとして実現されていることに注目しましょう。

 つまり、我々がよく使うプログラム言語の処理系の一部が、ソースコードから実行可能なマシンコードに変換されていく過程で、スタックマシンというモデルを経由していると言うことです。

 なぜ、スタックマシンを経由するのかと言えば、これが非常にシンプルかつ強力な表現であるからです。普通のマシン語の命令体系では、たいてい複雑なアドレス指定が付いていて、それらを活かすようなプログラムは複雑化します。それに対して、スタックマシンは全ての操作がスタックを対象としていて、かつ、スタックは暗黙的に存在が仮定されるために、それを指定するパラメタもありません。つまり、複雑なアドレス指定のようなものは、一切存在しません。(それが必要なら、間接的な表現で実現する)

 この相違は、普通のよくあるCPUのエミュレータと、スタックマシンの仮想マシン語のエミュレータを両方実装してみると良く分かります。後者の方が圧倒的にシンプルです。

 そして、シンプルなモデルは、様々な付加価値的な機能の実装をやりやすくします。たとえば、コードの最適化など。

 つまり、スタックマシンは、プログラム言語処理系を学ぶ上で避けては通れない基本の1つです。いや、偉そうなことを言いつつ、私はきちんとプログラム言語処理系を学んだことなど無いのだけど (汗。

 しかし単に避けて通れないだけではありません。人の都合に偏りすぎた高級言語のソースコードの表現でもない。マシンの都合に偏り過ぎた低レベルのマシン語の表現でもない。その中間に位置する抽象的かつシンプルで美しい表現を知ることは、一種の快楽であるとも言えるでしょう。

 (うーん、プログラム言語ミーハー冥利に尽きる一言が書けて嬉しい)